#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/11/2 18:32
# @Author  : summer
# @Email   : 610658552@qq.com
# @File    : view_wechat_openid.py
# @Software: PyCharm
# @Desc    : WechatOpenid视图（客户信息CRUD）
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from rest_framework.generics import GenericAPIView
from rest_framework.exceptions import ValidationError

from common.utils.pagination import EnhancedPageNumberPagination
from common.utils.rsp import success_response, error_response
from wechat.filters.filter_wechat_openid import WechatOpenidFilter
from wechat.models import WechatOpenid, WechatLog
from wechat.sers.ser_wechat_openid import WechatOpenidSerializer


class WechatOpenidListCreateView(GenericAPIView):
    """
    WechatOpenid列表查询 + 新增接口
    - GET: 分页查询客户信息列表（支持筛选、排序）
    - POST: 新增客户信息（自动校验手机号/Openid唯一性）
    """
    # 仅查询“未删除+非压测”的有效数据
    queryset = WechatOpenid.objects.filter(is_delete=0, pt_flag=0)
    serializer_class = WechatOpenidSerializer
    pagination_class = EnhancedPageNumberPagination  # 复用通用分页器

    # 过滤与排序配置
    filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
    filterset_class = WechatOpenidFilter  # 绑定过滤器
    ordering_fields = ["create_time", "name", "wechat_name", "sort_num"]  # 支持排序的字段
    ordering = ["-create_time"]  # 默认按创建时间倒序（最新客户在前）

    def get(self, request):
        """GET请求：分页查询客户信息列表"""
        # 1. 应用筛选条件
        filtered_qs = self.filter_queryset(self.get_queryset())
        # 2. 应用分页
        page_qs = self.paginate_queryset(filtered_qs)
        # 3. 序列化数据
        serializer = self.get_serializer(page_qs, many=True)
        # 4. 组装分页响应
        paginated_data = self.paginator.get_paginated_response(serializer.data).data

        return success_response(
            data=paginated_data,
            message="客户信息列表查询成功"
        )

    def post(self, request):
        """POST请求：新增客户信息"""
        # 1. 数据校验（触发序列化器的唯一性/格式校验）
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # 2. 保存数据
        serializer.save()

        return success_response(
            data=serializer.data,
            message=f"客户「{serializer.validated_data['name']}（{serializer.validated_data['phone']}）」创建成功"
        )


class WechatOpenidRetrieveUpdateDestroyView(GenericAPIView):
    """
    WechatOpenid单条操作接口
    - GET: 查询单个客户详情
    - PUT: 全量更新客户信息（需传所有必填字段）
    - PATCH: 部分更新客户信息（仅传需修改的字段）
    - DELETE: 逻辑删除客户信息（检查是否关联发送记录）
    """
    queryset = WechatOpenid.objects.filter(is_delete=0, pt_flag=0)
    serializer_class = WechatOpenidSerializer
    lookup_field = "pk"  # 按主键ID查询

    def get_object(self):
        """获取有效客户信息（未删除+非压测），不存在则抛错"""
        instance = super().get_object()
        if instance.is_delete == 1 or instance.pt_flag == 1:
            raise ValidationError("客户信息不存在或已被删除，无法操作")
        return instance

    def get(self, request, pk):
        """GET请求：查询单个客户详情"""
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return success_response(data=serializer.data, message="客户信息详情查询成功")

    def put(self, request, pk):
        """PUT请求：全量更新客户信息（需传所有必填字段）"""
        instance = self.get_object()
        # partial=False：全量更新，必须传所有required字段
        serializer = self.get_serializer(instance, data=request.data, partial=False)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return success_response(
            data=serializer.data,
            message=f"客户「{instance.name}（{instance.phone}）」全量更新成功"
        )

    def patch(self, request, pk):
        """PATCH请求：部分更新客户信息（仅传需修改的字段）"""
        instance = self.get_object()
        # partial=True：部分更新，无需传所有字段
        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return success_response(
            data=serializer.data,
            message=f"客户「{instance.name}（{instance.phone}）」部分更新成功"
        )

    def delete(self, request, pk):
        """DELETE请求：逻辑删除客户信息（检查是否关联微信发送记录）"""
        instance = self.get_object()
        # 检查是否有关联的微信发送记录（避免数据引用异常）
        if WechatLog.objects.filter(phone=instance.phone, is_delete=0).exists():
            return error_response(
                message=f"客户「{instance.name}（{instance.phone}）」已关联微信发送记录，无法删除",
                code=400
            )
        # 执行逻辑删除（仅改状态，不物理删除）
        instance.is_delete = 1
        instance.save()

        return success_response(
            data=None,
            message=f"客户「{instance.name}（{instance.phone}）」已成功删除（逻辑删除）"
        )